package com.qinglei.recoup.common.utils;

import com.qinglei.recoup.system.pojo.LocalTimeVO;
import com.qinglei.recoup.system.pojo.TimePeriodParam;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by qTo on 2020/12/8.
 */
public class DateTimeUtils {
    private DateTimeUtils() {}

    public static final DateTimeFormatter yyyy_M_d = DateTimeFormatter.ofPattern("yyyy-M-d");
    public static final DateTimeFormatter yyyy_MM_dd = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static final DateTimeFormatter yyyy_M_d_H_m = DateTimeFormatter.ofPattern("yyyy-M-d H:m");
    public static final DateTimeFormatter yyyy_MM_dd_H_m_s = DateTimeFormatter.ofPattern("yyyy-MM-dd H:m:s");
    public static final DateTimeFormatter yyyy_MM_dd_HH_mm_ss = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter HH_mm = DateTimeFormatter.ofPattern("HH:mm");
    public static final DateTimeFormatter HH_mm_ss = DateTimeFormatter.ofPattern("HH:mm:ss");

    public static LocalDate yyyy_MM_dd(String localDate) {
        return LocalDate.parse(localDate, yyyy_MM_dd);
    }


    /**
     * 检查两个时间段是否有重叠
     *
     * @param time1
     * @param time2
     * @return true - 有重叠 false - 无重叠
     */
    public static boolean checkTimeOverlap(TimePeriodParam time1, TimePeriodParam time2) {
        List<LocalTimeVO> localTimeVOList1 = strTime2LocalTimeList(time1);
        List<LocalTimeVO> localTimeVOList2 = strTime2LocalTimeList(time2);
        for (LocalTimeVO localTimeVO1 : localTimeVOList1) {
            LocalTime startTime1 = localTimeVO1.getStartTime();
            LocalTime endTime1 = localTimeVO1.getEndTime();
            for (LocalTimeVO localTimeVO2 : localTimeVOList2) {
                LocalTime startTime2 = localTimeVO2.getStartTime();
                LocalTime endTime2 = localTimeVO2.getEndTime();
                if (startTime1.isAfter(startTime2) && startTime1.isBefore(endTime2)) {
                    return true;
                } else if (endTime1.isAfter(startTime2) && endTime1.isBefore(endTime2)) {
                    return true;
                } else if (startTime2.isAfter(startTime1) && startTime2.isBefore(endTime1)) {
                    return true;
                } else if (endTime2.isAfter(startTime1) && endTime2.isBefore(endTime1)) {
                    return true;
                } else if (endTime2.equals(endTime1) && startTime2.equals(startTime1)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 字符串时间转LocalTime，并拆分跨天时间段
     *
     * @param period
     * @return
     */
    public static List<LocalTimeVO> strTime2LocalTimeList(TimePeriodParam period) {
        List<LocalTimeVO> localTimeList = new ArrayList<>();
        LocalTime startTime = LocalTime.parse(period.getStartTime());
        LocalTime endTime = LocalTime.parse(period.getEndTime());
        if (startTime.isAfter(endTime)) {
            LocalTime startTimeTmp = LocalTime.of(0, 0);
            LocalTimeVO localTimeVO = new LocalTimeVO(startTimeTmp, endTime);
            localTimeList.add(localTimeVO);
            endTime = LocalTime.of(23, 59, 59);
        }
        LocalTimeVO localTimeVO = new LocalTimeVO(startTime, endTime);
        localTimeList.add(localTimeVO);
        return localTimeList;
    }
}
